<?php

/**
 * Class Campaigns отвечает за все операции
 * имеющие отношения к рекламным кампаниям рекламодателя
 */
class Adv_Model_Campaigns extends Zend_Db_Table_Abstract {

    /**
     * Дефолтная таблица в БД
     * @var str 
     */
    protected $_name = 'campaigns'; 
    
    /**
     * Выборка 5 последних активных кампаний
     * @return array 
     */
    public function getLastActiveCampaigns() {        
        $db = $this->getDefaultAdapter();
        $select = $db->select()
                       ->from(array('c' => 'campaigns'))
                       ->join(array('cb' => 'campaigns_budget'),
                                    'c.id = cb.id_campaign')
                       ->order('c.id DESC')   
                       ->where('c.id_status =?', 1)
                       ->limit('5');                       
        return $db->fetchAll($select);

    }


    /**
     * Выборка всех кампаний рекламодателя
     * @param  int $id_adv - id - рекламодателя;
     * @return array 
     */
    public function getAllCampaigns($id_adv) {
        $db = $this->getDefaultAdapter();
        $select = $db->select()
                ->from(array('c' => 'campaigns'))
                ->join(array('csc' => 'category_site_child'), 'csc.id = c.id_category', array('cat_name' => 'csc.name'))
                ->join(array('su' => 'status_users'), 'su.id = c.id_status', array('status' => 'su.name'))
                ->join(array('cb' => 'campaigns_budget'), 'cb.id_campaign = c.id', array('cb.start_budget', 'cb.current_budget'))
                ->join(array('a' => 'advertisements'), 'a.id_campaign = c.id', array('count' => 'COUNT(a.id_campaign)'))
                ->where('c.id_advertiser = ?', intval($id_adv));
        return $db->fetchAll($select);

    }

    /**
     * Активация/деактивация выбранной рекламной компании
     * @param  $id - id рекламной компании
     * @param array $data 
     */
    public function activateDeactivateCampaign($id, $data, $id_adv) {
        $this->_name = 'campaigns';
        $this->update($data, 'id = ' . intval($id). 'AND id_advertiser = '.  intval($id_adv));
    }

    /**
     * Удаление выбранной рекламной компании
     * @param int $id 
     */
    /*
      public function deleteCampaign($id) {
      $db = $this->getDefaultAdapter();
      $db->query('DELETE campaigns, campaigns_budget
      FROM campaigns
      LEFT JOIN campaigns_budget
      ON campaigns_budget.id_campaign = campaigns.id
      WHERE id_campaign = '.intval($id));

      } */
/*
    public function deleteCampaign($id) {
        $this->_name = 'campaigns_budget';
        $this->delete('campaigns_budget,campaigns','campaigns_budget.id_campaign =' . (int) $id)
                //->from('campaigns_budget')
                ->join('campaigns', 'campaigns.id=campaigns_budget.id_campaign')
                ->where('campaigns.id_campaign =' .(int)$id)
                ->setIntegrityCheck(false);
    }
*/
    
    public function deleteCampaign($id) {
       $db = $this->getDefaultAdapter();
       $db->delete()
               ->from(array('c' => 'campaigns'))
               //->join()
               ->where('c.id = ?', intval($id));
    }

    
    /**
     * Выборка кол-ва просмотров указанной кампании
     * @param int $id_campaign - id кампании
     * @return array 
     */
    public function getCountCampaignView($id_campaign) {
        $this->_name = 'campaign_view';
        $select = $this->select()
                       ->from($this->_name,array('count_view' => 'COUNT(*)'))
                       ->where('id_campaign =?', intval($id_campaign));
        return $this->fetchRow($select);
    }
    
    /**
     * Выборка кол-ва кликов указанной кампании
     * @param int $id_campaign - id кампании
     * @return array 
     */
    public function getCountCampaignClick($idCampaign) {
        $this->_name = 'campaign_click';
        $select = $this->select()
                       ->from($this->_name, array('count_click' => 'COUNT(*)'))
                       ->where('id_campaign =?', intval($idCampaign));
        return $this->fetchRow($select);
    }
    
    /**
     * Выборка кол-ва всех кампаний рекламодателя
     * @param int $idAdvertiser - id рекламодателя
     * @return array 
     */
    public function getCountAllAdverCampaigns($idAdvertiser) {
        $this->_name = 'campaigns';
        $select = $this->select()
                       ->from($this->_name, array('count_campaigns' => 'COUNT(*)'))
                       ->where('id_advertiser =?', intval($idAdvertiser));
        return $this->fetchRow($select);
    }
    
    /**
     * Выборка кол-ва кампаний рекламодателя в зависмости
     * от передаваемого статуса:
     * активный, не подтвержденный, заблокированный
     * @param int $idAdvertiser - id рекламодателя
     * @param int $idStatus - id текущего статуса
     * @return array 
     */
    public function getCountStatusAdverCampaigns($idAdvertiser, $idStatus) {
        $this->_name = 'campaigns';
        $select = $this->select()
                       ->from($this->_name, array('count_active' => 'COUNT(*)'))
                       ->where('id_status =?', intval($idStatus))
                       ->where('id_advertiser =?', intval($idAdvertiser));
        return $this->fetchRow($select);
    }
    
    /**
     * Метод принимает строку вида: '$100,500.12' или '$10.00' 
     * и преобразует в нужный формат: 100500.12 и 10 соответственно  
     * @param str $str
     * @return float 
     */
    public function jsMoneyStrToFloat($str) {
        $str =  substr($str, 1, strlen($str));        
        $array = explode(',', $str);
        $string = '';
        if ( ($count = count($array)) > 1) {             
            for ($i = 0; $i < $count; $i++) {
                $string.= $array[$i]; 
            } 
            return floatval($string);            
        } else {
            return floatval($array[0]);
        }                
    }
    
    /**
     *  Создание новой рекламной кампании
     * @param array $data
     * @return int - last id
     */
    public function addCampaign($data) {
        $this->_name = 'campaigns';
        $this->insert($data);   
        return $this->getAdapter()->lastInsertId();
    }
    
    /**
     * Выборка всех категорий
     * @return array 
     */
    public function getAllCategories() {
        $this->_name = 'category_site_child';
        $select = $this->select()
                       ->from($this->_name);
        return $this->fetchAll($select)->toArray();
    }
    
    /**
     * Выборка всех стран
     * @return array 
     */
    public function getAllCountries() {
        $this->_name = 'countries';
        $select = $this->select()
                       ->from($this->_name);
        return $this->fetchAll($select)->toArray();
    }
    
    /**
     * Выборка регионов указанной страны
     * @param int $idCountry
     * @return array 
     */
    public function getAllRegionsCountry($idCountry) {
        $this->_name = 'regions';
        $select = $this->select()
                       ->from($this->_name)
                       ->where('id_country =?', intval($idCountry));
        return $this->fetchAll($select)->toArray();
    }
    
    /**
     * Добавление географии показа страны
     * рекламной кампании
     * @param array $data 
     */
    public function addGeographySpaceCountry($data) {
        $this->_name = 'geography_countries_campaigns';
        $this->insert($data);
    }
    
    /**
     * Добавление географии показа регионов
     * рекламной кампании
     * @param array $data 
     */
    public function addGeographySpaceRegion($data) {
        $this->_name = 'geography_regions_campaigns';
        $this->insert($data);
    }
    
    /**
     * Добавление бюджета кампании
     * @param array $data 
     */
    public function addCampaignBudget($data) {
        $this->_name = 'campaigns_budget';
        $this->insert($data);
    }
    
    /**
     * Добавление контактов кампании
     * @param array $data 
     */
    public function addContactsCampaign($data) {
        $this->_name = 'campaigns_contacts';
        $this->insert($data);
    }
    
    /**
     * Создание связи между ключевым словом 
     * и контекстным объявлением
     * @param array $data 
     */
    public function setContextAndKeywordConnection($data) {
        $this->_name = 'keywords_context';
        $this->insert($data);
    }
    
    /**
     * Добавление нового ключевого слова
     * @param array $data
     * @return int - last id 
     */
    public function addNewKeyword($data) {
        $this->_name = 'keywords';
        $this->insert($data);
        return $this->getAdapter()->lastInsertId();
    }
    
    /**
     * Добавление нового контекстного объявления
     * @param array $data
     * @return int - last id 
     */
    public function addContextAdver($data) {
        $this->_name = 'context_adver';
        $this->insert($data);
        return $this->getAdapter()->lastInsertId();
    }
    
    /**
     * Добавление бюджета контекстного объявления
     * @param array $data 
     */
    public function addContextBudget($data) {
        $this->_name = 'context_budget';
        $this->insert($data);
    }
    
    /**
     * Добавления микроблога или социалки
     * @param array $data 
     */
    public function addBlogOrSocialAdver($data) {
        $this->_name = 'blog_and_social_advers';
        $this->insert($data);
    }
    
    /**
     * Добавление баннера
     * @param array $data
     * @return int - last id 
     */
    public function addBannerAdver($data) {
        $this->_name = 'banners';
        $this->insert($data);
        return $this->getAdapter()->lastInsertId();
    }
    
    /**
     * Добавления бюджета баннера
     * @param array $data 
     */
    public function addBannerBudget($data) {
        $this->_name = 'banner_budget';
        $this->insert($data);
    }
    
    /**
     * Создание связи между ключевым словом и баннером
     * @param array $data 
     */
    public function setBannerAndKeywordConnection($data) {
        $this->_name = 'keywords_banner';
        $this->insert($data);
    }
    
    /**
     * Выборка всех категорий указанного сайта
     * @param int $idCategory
     * @return array 
     */
    public function getCategorySites($idCategory) {
        $this->_name = 'sites';
        $select = $this->select()
                       ->from(array('s' => 'sites'))                       
                       ->where('s.id_category_site =?', intval($idCategory))
                       ->where('s.id_status =?', 1)
                       ->setIntegrityCheck(false);
        return $this->fetchAll($select)->toArray();
    }
    
    /**
     * Выборка всех рекламных мест указанного сайта
     * подходящих под параметры ширины и высоты
     * @param int $idSite
     * @param int $height
     * @param int $width
     * @return array 
     */
    public function getSiteAdvSpaces($idSite, $height, $width) {
        $this->_name = 'advertising_spaces';
        $select = $this->select()
                       ->from($this->_name, array('width', 'height'))
                       ->where('width >= ?', $width)
                       ->where('height >= ?', $height)
                       ->where('id_status =?', 1)
                       ->where('id_type_adver =?', 2)
                       ->where('id_site =?', intval($idSite));
        return $this->fetchAll($select)->toArray();
    }
    
    /**
     * 
     * @param int $idSite
     * @param int $idKeyword
     * @return array 
     */
    public function getCountSiteKeywords($idSite, $idKeyword) {
        $this->_name = 'site_keywords';
        $select = $this->select()
                       ->from($this->_name, array('count' => 'COUNT(*)'))
                       ->where('id_site =?', intval($idSite))
                       ->where('id_keyword =?', intval($idKeyword));
        return $this->fetchRow($select);
    }
}

?>
